#include <iostream>

using namespace std;

const int N = 5e3 + 10;

//如果想尽可能多的摧毁目标，炸弹的边应该和矩阵的边重叠
//解法：暴力枚举
//在坐标系中枚举出所有变长为m的正方形，找出正方形中目标价值最大的即可

//如何枚举出所有边长为m的正方形：只需枚举出右下角，可以推出左上角的下标
//(x2,y2)--->(x2-m+1, y2-m+1)
//如何快速求出正方形中所有目标的价值：利用二维前缀和即可

int n, m; 
int a[N][N];
int f[N][N]; // 前缀和矩阵

int main()
{
	cin >> n >> m;

	while(n--)	
	{
		int x, y, v; cin >> x >> y >> v;
		x++; y++; // 下标从 1 开始计数
		a[x][y] += v; // 可能存在多个目标在同一位置上的情况
	}

	n = 5001;
	//预处理前缀和矩阵
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			f[i][j] = f[i - 1][j] + f[i][j - 1] - f[i - 1][j - 1] + a[i][j];
		}
	}
	
	//枚举所有变长为m的正方形
	//如果正方形边长大于矩形，不会进入循环，但是实际上整个矩形区域都会被炸掉
	int ret = 0;
	m = min(m, n); // 如果m很大，相当于就是把整个区域全部摧毁
	for(int x2 = m; x2 <= n; x2++)
	{		
		for(int y2 = m; y2 <= n; y2++)
		{
			int x1 = x2 - m + 1; 
			int y1 = y2 - m + 1;
			ret = max(ret, f[x2][y2] - f[x1 - 1][y2] - f[x2][y1 - 1] + f[x1 - 1][y1 - 1]);
		}
	}

	cout << ret << endl;


	return 0;
}


